home *** CD-ROM | disk | FTP | other *** search
- /* =============
- * SiesString.cc
- * =============
- */
-
- #include <string.h>
-
- #include <Memory.h>
-
- #include "DGHandleLocker.hh"
-
- #include "SiesString.hh"
-
- SiesString::SiesString()
- : mPtr(NULL), mLen(-1)
- {
-
- }
-
- SiesString::SiesString(const SiesString &inString)
- : mPtr(NULL), mLen(-1)
- {
- Set(inString);
- }
-
- SiesString::SiesString(void *inData, long inLen)
- : mPtr(NULL), mLen(-1)
- {
- Set(inData, inLen);
- }
-
- SiesString::SiesString(const char *inCStr)
- : mPtr(NULL), mLen(-1)
- {
- Set(inCStr);
- }
-
- SiesString::SiesString(const unsigned char *inPStr)
- : mPtr(NULL), mLen(-1)
- {
- Set(inPStr);
- }
-
- SiesString::SiesString(Handle inHandle)
- : mPtr(NULL), mLen(-1)
- {
- Set(inHandle);
- }
-
- SiesString::~SiesString()
- {
- delete [] mPtr; // checks for NULL
- }
-
-
- void
- SiesString::Set(const void *inData, long inLen)
- {
- Realloc(inLen);
- memcpy(mPtr, inData, inLen);
- }
-
- void
- SiesString::Set(const SiesString &inString)
- {
- Set(inString.Ptr(), inString.Length());
- }
-
- void
- SiesString::Set(const char *inCStr)
- {
- Set((void *)inCStr, strlen(inCStr));
- }
-
- void
- SiesString::Set(const unsigned char *inPStr)
- {
- Set(inPStr + 1, inPStr[0]); // inPStr[0] can be 255, but never -1
- }
-
- void
- SiesString::Set(Handle inHandle)
- {
- if (!inHandle) return;
- if (!*inHandle) {
- // Empty handle (NULL master pointer), probably was purged.
- // Should throw appropriate error.
- return;
- }
- Size size = GetHandleSize(inHandle);
- if (size == 0) return;
-
- DGHandleLocker lock(inHandle);
- Set(*inHandle, size);
- }
-
-
- void
- SiesString::Append(const void *inData, long inLen)
- {
- long oldLen = mLen;
- Realloc(oldLen + inLen);
- memcpy((char *)mPtr + oldLen, inData, inLen);
- }
-
- void
- SiesString::Append(const SiesString &inString)
- {
- Append(inString.Ptr(), inString.Length());
- }
-
- void
- SiesString::Append(const char *inCStr)
- {
- Append((void *)inCStr, strlen(inCStr));
- }
-
- void
- SiesString::Append(const unsigned char *inPStr)
- {
- Append(inPStr + 1, inPStr[0]); // inPStr[0] can be 255, but never -1
- }
-
- void
- SiesString::Append(Handle inHandle)
- {
- if (!inHandle) return;
- if (!*inHandle) {
- // Empty handle (NULL master pointer), probably was purged.
- // Should throw appropriate error.
- return;
- }
- Size size = GetHandleSize(inHandle);
- if (size == 0) return;
-
- DGHandleLocker lock(inHandle);
- Append(*inHandle, size);
- }
-
-
- long
- SiesString::Length() const
- {
- return (mLen < 0) ? 0 : mLen;
- }
-
- void *
- SiesString::Ptr() const
- {
- return mPtr;
- }
-
- long
- SiesString::GetData(void *outData, long inLen) const
- {
- long len = (mLen < inLen) ? mLen : inLen;
-
- memcpy(outData, mPtr, len);
- return len;
- }
-
- char *
- SiesString::GetCStr(char *outCStr, long inLen) const
- {
- long len = (mLen < inLen) ? mLen : inLen;
- outCStr[len] = '\0';
-
- // Note: a null byte will truncate the string.
- return strncpy(outCStr, (char *)mPtr, len); // outCStr must be >= inLen + 1 bytes
- }
-
- unsigned char *
- SiesString::GetPStr(unsigned char *outPStr, short inLen) const
- {
- long len = (mLen < inLen) ? mLen : inLen;
- if (len > 255) len = 255;
-
- outPStr[0] = len;
- return (unsigned char *)memcpy((char *)outPStr + 1, (char *)mPtr, len);
- }
-
-
- void
- SiesString::Realloc(long inSize)
- {
- if (mLen == inSize) return;
- void *oldPtr = mPtr;
- long oldLen = mLen;
- mLen = inSize;
- if (inSize == -1) {
- mPtr = NULL;
- delete [] oldPtr; // checks for NULL
- return;
- }
- mPtr = new char [inSize];
- // Does new throw exceptions? Let's hope so...
- if (oldLen > mLen) {
- oldLen = mLen;
- }
- memcpy(mPtr, oldPtr, oldLen);
- delete [] oldPtr; // checks for NULL
- }
-